支持转换为sql的内联方法

时间:2013-07-27 19:00:36

标签: c# linq

有一个数据库模型,其中包含两个与外键相关的实体,例如

class Item
{
  public int ID;
  public string Name;
  public int StatusID;
}

class Status
{
  public int ID;
  public string Name;
}

有我自己的班级

class MyClassFormat 
{
  public int ID;
  public string Name;
  public string Status;
}

现在我想创建一个返回自己类的方法,类似

MyClassFormat getTtem(this Item item)
{
  return new MyClassFormat{ID = item.ID, Name = item.Name, Status = item.Statuses.Name}
}

问题是当我使用这个方法时,我得到一个异常,我的方法没有支持转换为SQL

是否可以创建一个可以解包其内容而不是调用此方法的方法?

解决:这两个答案都适合解决我的问题,但第二个答案是我要找的那个,谢谢你们两个

2 个答案:

答案 0 :(得分:2)

或者:

query
    .Select(item => new
    {
        ID = item.ID,
        Name = item.Name,
        Status = item.Statuses.Name
    })
    .ToArray()
    .Select(item => new MyClassFormat
    {
        ID = item.ID,
        Name = item.Name,
        Status = item.Status
    });

或:

query
    .ToArray()
    .Select(item => getTtem(item));

第一种方式是编写时间较长,但它从数据库中加载的数据较少。 无论如何,您需要实现查询结果(示例中的ToArray方法)。

答案 1 :(得分:0)

如果您的目标是编写代码以在多个查询中重用,则可以将这样的表达式分解为:

static Expression<Func<Item, MyClassFormat>> ItemToClassFormat()
{
    return item => new MyClassFormat 
       {
           ID = item.ID, 
           Name = item.Name, 
           Status = item.Statuses.Name
       }
}

这可以类似于:

IQueryable<Item> query = ...;
var selector = ItemToClassFormat();
var results = query.Select(selector).ToList();