gpt4 book ai didi

entity-framework - 上下文 SqlQuery<>() 而不详细说明所有列

转载 作者:行者123 更新时间:2023-12-03 03:38:48 24 4
gpt4 key购买 nike

假设我有一个包含 3 列的 Person 实体:

public PERSON {
public int OID { get; set; }
public string NAME { get; set; }
public string SURNAME { get; set; }
}

我想用原始 SQL 查询它,但不指定所有列,所以我写:

var query = "select NAME, SURNAME from PERSON";
var list = context.SqlQuery<PERSON>(query).ToList();

但它抛出异常:

System.Data.Entity.Core.EntityCommandExecutionException : The data reader is incompatible with the specified '...'. A member of the type, 'OID', does not have a corresponding column in the data reader with the same name.

因此,它似乎尝试映射所有列,如果缺少某些列,则会抛出异常。

有没有办法让它忽略原始 SQL 查询中不存在的列并仅映射可访问的列?

原因是,我对某些实体有很多列,有时我只想查询部分列。我不想创建只包含每个查询所需列的新类。

最佳答案

我能立即想到 3 个适合您的选项。

选项 1:重写您的查询并使用标准 Linq 查询:

var persons = from p in context.Persons
select new PERSON
{
NAME = p.NAME,
SURNAME = p.SURNAME
};

选项 2:为不需要的列返回虚拟值

var query = "select 0 AS OID, NAME, SURNAME from PERSON";
var list = context.SqlQuery<AlmostPERSON>(query).ToList();

选项 3:使用数据库中所需的列创建您自己的中间类:

public class AlmostPERSON
{
public string NAME { get; set; }
public string SURNAME { get; set; }
}

var query = "select NAME, SURNAME from PERSON";
var list = context.SqlQuery<AlmostPERSON>(query).ToList();

您甚至可以将这个中间类投影到您的标准实体上,如下所示:

var list = context.SqlQuery<AlmostPERSON>(query)
.Select(ap => new PERSON
{
NAME = ap.NAME,
SURNAME = ap.SURNAME
})
.ToList();

关于entity-framework - 上下文 SqlQuery<>() 而不详细说明所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com