我有以下代码,我需要用if语句修改,如果有什么结果,或者做到这一点。这就是我现在所拥有的:
var result = (from fs in ctx.datFiles
where fs.File_ID == fID
select new
{
LastName = fs.datClaim.LastName,
FirstName = fs.datClaim.FirstName,
}).FirstOrDefault();
DetailsModelView dmv = new DetailsModelView
{
ClaimID = result.ClaimID,
LastName = result.LastName,
FirstName = result.FirstName,
};
我想做类似的事情:
var result =""
if (something)
{
result = (from fs in ctx.datFiles
where fs.File_ID == fID
select new
{
LastName = fs.datClaim.LastName,
FirstName = fs.datClaim.FirstName,
}).FirstOrDefault();
}
else
{
result = (from fs in ctx.datFiles
where fs.File_ID == 5
select new
{
LastName = fs.datClaim.LastName,
FirstName = fs.datClaim.FirstName,
}).FirstOrDefault();
}
DetailsModelView dmv = new DetailsModelView
{
ClaimID = result.ClaimID,
LastName = result.LastName,
FirstName = result.FirstName,
};
但是我不断收到以下错误:当我尝试在LINQ语句之外创建“result”时,无法将类型'AnonymousType#1'隐式转换为'string'。
我需要声明结果以使其工作,而不是字符串?
这只是一个简单的例子,我的查询在“else”上变得更复杂,然后只是ID更改。
答案 0 :(得分:4)
这是一个有效的功能程序:
var foo = new {LastName = "", FirstName=""};;
int bar = 1;
if (bar==1)
{
foo = new {LastName = "test1", FirstName="test2"};
}
else
{
foo = new {LastName = "test3", FirstName="test4"};
}
正如您所看到的,我创建了一个虚拟匿名对象,以便var foo
知道要创建的对象。这显然应该是与在if语句的两个分支中创建int相同的匿名对象。
还应该注意,在上面的代码中似乎没有任何理由不直接在linq中使用DetailsModelView
而不是匿名类型。可能是您的用例更复杂,但由于存在简单的一对一映射,您可以创建当前创建匿名方法的DetailsModelView
。然后可以将结果定义为DetailsModelView
。
答案 1 :(得分:1)
var result =""
结果已经是字符串。
怎么样:
int id;
if(something)
{
id = fID;
}
else
{
id = 5;
}
var result = (from fs in ctx.datFiles
where fs.File_ID == id
select new
{
LastName = fs.datClaim.LastName,
FirstName = fs.datClaim.FirstName,
}).FirstOrDefault();
答案 2 :(得分:1)
正如其他人所说,var result = "";
与string result = "";
相同,因此当您尝试将其值设置为linq结果时,会尝试将其转换为字符串。
根据实际代码的设计方式,您可以使用FirstName,LastName属性声明一个简单类型,而不是返回匿名类型。类似地,如果您总是要使用LINQ调用的结果创建DetailsModelView的实例,则可以将结果变量声明为DetailsModelView result = null;
,并在代码中返回DetailsModelView而不是匿名类型。最后,您只需要在DetailsViewModel中指定额外的属性(如果有的话),而不是实例化一个新属性。
DetailsViewModel result = null;
if (something)
result = ;// LINQ Query
else
result = ;// LINQ Query
答案 3 :(得分:0)
您根本不需要Linq投影。
编辑 - 但正如Servy所指出的,如果这是一个ORM调用,你可能确实需要它,这意味着需要投影。
如果FirstOrDefault
返回null,那么你的代码将抛出空引用异常。
int searchId = fId;
if(something)
searchId = fId;
else
searchId = 5;
var result = ctx.datFiles.FirstOrDefault(fs => fs.File_ID == searchId)
.Select(fs=> new
{
Id = fs.datClaim.Id,
LastName = fs.datClaim.LastName,
FirstName = fs.datClaim.FirstName,
});
if(result == null)
throw new Exception(); // if there is no result your code will throw!
DetailsModelView dmv = new DetailsModelView
{
ClaimID = result.Id,
LastName = result.LastName,
FirstName = result.FirstName,
};
答案 4 :(得分:0)
这篇文章告诉你如何转换为匿名类型: http://tomasp.net/blog/cannot-return-anonymous-type-from-method.aspx
C#中匿名类型的一个特性是,如果它们包含相同的数据,那么该类型将被重用,以便您稍后可以引用它 - 在这种情况下允许您转换它。
我不确定这对你来说是最好的解决方案,但它应该可行。
答案 5 :(得分:-1)
将var result = "";
更改为
var result = new
{
LastName = "",
FirstName = "",
};
答案 6 :(得分:-2)
变化
var result = "";
到
var result;
确保在LINQ语句之外创建它时将其转换为
DetailsModelView