6

我正在与 EF 合作并有一些疑问。这是我的代码

IEnumerable<Customer> customers = from c in context.Customers 
    select new Customer
    {
        ID = c.ID,
        Name = c.Name,
        LastName = c.LastName,
        DepID = c.DepID,
        Editable = SomeStruct.Check(c.DepID)
    }

public struct SomeStruct
{
    public static bool Check(int depID)
    {
        //Here I have some logic
    }
}

它工作正常。但是,如果我声明SomeStructclass会失败。

我的问题是:

  1. 为什么会发生?
  2. 使用静态函数会强制执行查询吗?
4

3 回答 3

6

在您的代码方法SomeStruct.Check(c.DepID)中应该转换为 SQL 查询。这描述了类/结构等的行为。这是由于实体框架在类和结构中使用此类方法的不同工作。但是你可以在客户端上做这个检查:

IEnumerable<Customer> customers = from c in context.Customers 
    select new
    {
        ID = c.ID,
        Name = c.Name,
        LastName = c.LastName,
        DepID = c.DepID
    }
    .AsEnumerable()
    .Select(d => new Customer
    {
        ID = c.ID,
        Name = c.Name,
        LastName = c.LastName,
        DepID = c.DepID,
        Editable = SomeStruct.Check(c.DepID)
    });

或者您可以将Editable属性设置为只读属性:

public class Customer
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
    public Guid DepID { get; set; }
    public bool Editable { get { return SomeStruct.Check(DepID); } }
}
于 2012-12-21T12:01:09.777 回答
1

很容易重现您的代码无法与 linq to 实体一起使用。任何不能翻译成 sql 的东西都会抛出运行时异常。在你的情况下:

NotSupportedException:LINQ to Entities 无法识别方法“Boolean Check(Int32)”方法,并且该方法无法转换为存储表达式。

如果你让它在某个时候运行,那可能没有关系structclass差异,请参阅静态结构方法和静态类方法之间有什么区别?

您可能同时更改了其他内容,例如ToList()select.

于 2012-12-21T19:23:47.773 回答
0

假设这是一个运行时问题,在您描述的许多情况下,这是一个参考问题。EF 的 linq 提供程序支持调用在类中声明的静态方法(静态或非静态)。

  1. 我建议您将结构更改为类并使其成为静态以帮助您调查问题。

  2. 不,在您调用第一次迭代或客户之前不会执行任何操作。

希望这可以帮助

于 2012-12-21T11:19:09.327 回答