如何从linq转换对象

时间:2015-08-20 10:23:52

标签: c# .net asp.net-mvc-4

var query = (from RESTAURANT in db.RESTAURANTs
             where RESTAURANT.REST_ID == RestID
             select new { name = RESTAURANT.name});

如何投射query代替var

谢谢。

添加更多信息,我想使以下内容成为可能。有可能吗?

enter image description here

4 个答案:

答案 0 :(得分:6)

您的查询当前使用select new { }分配匿名类型,这需要您使用var。如果要分配已知类型,请将其添加到select子句:

IEnumerable<SomeType> query = 
         from RESTAURANT in db.RESTAURANTs
         where RESTAURANT.REST_ID == RestID
         select new SomeType { Name = RESTAURANT.name } ;

public class SomeType
{
    public string Name { get; set; }
}

答案 1 :(得分:1)

鼠标悬停在var上,您的编译器会告诉您它替换它的类型。

如果您想明确使用该类型,则需要插入而不是var。但它不会改变编译器的任何内容。

答案 2 :(得分:1)

此:

var query = (from RESTAURANT in db.RESTAURANTs
             where RESTAURANT.REST_ID == RestID
             select new { name = RESTAURANT.name});

定义查询。当您的程序正在运行并且已处理此行时,query变量将引用查询实例。尚未调用该数据库。

如果您将(例如).ToList()附加到您的语句中,请执行以下操作:

var query = (from RESTAURANT in db.RESTAURANTs
             where RESTAURANT.REST_ID == RestID
             select new { name = RESTAURANT.name}).ToList();

然后query将包含从数据库中提取的项目列表。但仍然在这种情况下,列表中项目的类型是匿名类型,因此您仍然无法将var更改为命名类型。如果需要,则需要让查询返回已知的命名类型。像这样:

List<string> query = (from RESTAURANT in db.RESTAURANTs
             where RESTAURANT.REST_ID == RestID
             select RESTAURANT.name).ToList();

或者可能是这样的:

public class Restaurant 
{
    public string Name {get; set;}
}

List<Restaurant> query = (from RESTAURANT in db.RESTAURANTs
             where RESTAURANT.REST_ID == RestID
             select new Restaurant() { Name = name }).ToList();

答案 3 :(得分:0)

无需单独声明query, 使用?:operator var query = <condition> ? <1st Linq query> : <2nd Linq query>代替if-else 你可以这样做:

var query =  string.IsNullOrEmpty(dealer_code) ?  
             (from RESTAURANT in db.RESTAURANTs
             where RESTAURANT.REST_ID == RestID
             select new { name = RESTAURANT.name}):
             (from u in db.RESTAURANTs
             where u.dealer_code == dealer_code
             select new { name = u.name});