【问题标题】:Entity Framework Stored Procedure实体框架存储过程
【发布时间】:2016-06-28 21:55:46
【问题描述】:

我正在构建一个 Excel 导入功能,允许用户指定哪些列映射到对象的哪个属性。然后使用反射,创建一个新对象,设置属性值并将新对象插入 DbSet。但是,一些新对象可能是重复的,应该更新现有记录,而不是作为新对象添加到 DbSet。

Excel 工作表将不包含对象 ID 列。所以我想为其他字段(例如名字和姓氏)的组合添加一个索引。然后我想将对象列表传递给存储过程,就像传递表参数一样;所以我可以从数据库中选择索引匹配的所有记录。

如何将对象列表传入实体框架存储过程?

【问题讨论】:

    标签: c# excel entity-framework stored-procedures


    【解决方案1】:

    DbSet 已经是一个可以添加对象的列表对象。 如果您有一个唯一标识每个对象的功能键,那么您应该能够使用 LINQ 找到并更新它。

    【讨论】:

    • 这个。这个问题听起来像是一个 XY 问题,询问如何使用 SPROC,而在 LINQ 本身中检查现有匹配项并在必要时更新而不是插入可能更简单。
    • 随着我们数据库的增长,这将变得更加昂贵。有人告诉我,SQL Server 可以比 LINQ 更有效地处理这种需求。没有?
    • @Kris 正如我在问题中所述,我不会在导入的 Excel 文件中有一列带有 ID 列。这是问题的一部分。
    • 如果您可以识别数据集中的唯一键,您可以唯一地指向每条记录,则不需要技术 ID 或主键。使用唯一键(可能是几列)来插入和更新。
    • 经过测试,它比我预期的要快得多,即使有大量数据。
    【解决方案2】:

    您可以通过逗号分隔的列表(字符串)传递它们,只要它少于 8K 个字符。然后您可以通过此功能将它们拆分。 (该函数将在 SP 中使用)。

    CREATE PROCEDURE ...
    @NameList Varchar(8000)
    
    Select * from People 
    where (FirstName+'-'+LastName) in dbo.Split(@NameList,',')
    ....
    

    根据分隔符分割值的功能

    CREATE FUNCTION [dbo].[Split]
    (
        @Input VARCHAR(8000),
        @Delimiter CHAR(1)
    )
    RETURNS TABLE
    AS
    RETURN
    (
        WITH Split(stpos,endpos)
        AS(
            SELECT 0 AS stpos, CHARINDEX(@Delimiter,@Input) AS endpos
            UNION ALL
            SELECT endpos+1, CHARINDEX(@Delimiter,@Input,endpos+1)
                FROM Split
                WHERE endpos > 0
        )
        SELECT  SUBSTRING(@Input,stpos,COALESCE(NULLIF(endpos,0),LEN(@Input)+1)-stpos) As Item
        FROM Split
    )
    

    【讨论】:

    • 我认为这不会有效。如果我从 Excel 导入 1000 行,我必须为每一行连接多个值,然后将每一行中的联系人值连接到一个巨大的字符串中。然后 SQL 必须正确拆分每一行的值,然后是每一列。虽然它会起作用,但我正在寻找实现这一目标的最有效方法。
    • 是的,如果是这样,如果可能的话,最好不要使用 SP(仅通过 Linq 表达式)。否则,您可以将这些数据插入到临时表中,并在 SP 中使用这些临时表进行查询。但我建议你通过 linq 来做。临时表对我来说听起来有点 hacky。
    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 2013-03-19
    • 2016-09-18
    • 1970-01-01
    • 2011-03-13
    • 2012-04-13
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多