2009-07-14 40 views

Trả lời

1

tôi đã kết thúc đi cho một cách tiếp cận rất đơn giản được khuyến cáo của một câu trả lời ở đây đó là sau xóa:

var vote = (from vote in db.Vote 
      where vote.Voter.Id == user.Id 
      select v).FirstOrDefault(); 
if (vote == null) { 
    vote = new Vote() { .... }; 
    db.AddToVoteSet(vote); 
} 
+1

FYI, điều này không thỏa mãn câu hỏi ban đầu của bạn. Bạn đã yêu cầu nó trả về một giá trị mặc định, không phải để tạo một giá trị mới nếu nó không tồn tại. (Đây là mã tốt, chỉ không làm những gì bạn hỏi.) – BenSwayne

5

Thêm phương thức tiện ích của riêng bạn. Ví dụ:

public static class Extension 
{ 
    public static T FirstOrDefault(this IEnumerable<T> sequence, T defaultValue) 
    { 
     return sequence.Any() ? sequence.First() : defaultValue; 
    } 
} 

Với lớp trong phạm vi, bạn có thể nói:

var vote = (from vote in db.Vote where 
    vote.Voter.Id == user.Id 
    select v).FirstOrDefault(yourDefaultValue); 

Dĩ nhiên, phương pháp của bạn cũng có thể có một tình trạng quá tải mà trả về mặc định (T), nếu đó là những gì bạn nơi tìm kiếm. Đã có một phương thức mở rộng DefaultIfEmpty trong lớp mở rộng được xây dựng sẵn, vì vậy tôi đã đặt tên cho phương thức này trong ví dụ "FirstOrDefault", có vẻ như phù hợp hơn.

+0

DefaultIfEmpty() đã tồn tại như một phương pháp mở rộng :) http://msdn.microsoft.com/en-us/library/bb355419.aspx –

+0

Bạn nói đúng, tôi thay đổi nội dung ví dụ sử dụng một tên tốt hơn. – driis

+0

Tại sao tôi nên viết lại FirstOrDefault khi đã có một thiết kế cho mục đích đó? – Pablo

3

Chỉ cần thêm giá trị mặc định trước khi nhận phần tử đầu tiên.

var vote = db.Vote 
    .Where(v => v.Voter.Id == user.Id) 
    .DefaultIfEmpty(defaultVote) 
    .First(); 

Lưu ý rằng bây giờ bạn có thể sử dụng an toàn First() thay vì FirstOrDefault().

CẬP NHẬT

LINQ to Entity không nhận ra phương pháp DefaultIfEmpty() mở rộng. Nhưng bạn chỉ có thể sử dụng toán tử kết hợp null.

var vote = db.Vote.FirstOrDefault(v => v.Voter.Id == user.Id) ?? defaultVote; 
+1

Nếu khi thêm mặc định, bạn có thể sử dụng Trước tiên, tại sao FirstOrDefault tồn tại? – Pablo

+0

Nhiều người trong số các nhà khai thác LINQ có phần dư thừa - sequence.Any() có thể được viết lại như sequence.Count()> 0. Bạn có thể sử dụng sequence.Where (item => Condition (item)). First() hoặc sequence.First (item => Điều kiện (mục)). Bạn có thể sử dụng kết nối hoặc truy vấn lồng nhau. Khi viết mã, bạn có thể sử dụng cho, làm, và trong khi vòng lặp. Bạn thậm chí có thể sử dụng goto. Thông thường không chỉ có một cách để đạt được một mục tiêu nhất định. –

+3

Lưu ý rằng seq.Count() (đối với các đối tượng không thực hiện ICollection) sẽ liệt kê toàn bộ chuỗi trong khi seq.Any() sẽ trả lại ngay khi tìm thấy phần tử. Tương tự, nhưng khác nhau.:) – dahlbyk

17

cách tiếp cận khác, nếu Vote là một loại tài liệu tham khảo và do đó sử dụng null như giá trị mặc định của nó, sẽ được sử dụng các nhà điều hành coalescing null:

var vote = (db.Vote 
    .Where(v => v.Voter.Id == user.Id) 
    .FirstOrDefault()) ?? defaultVote; 
0

Đối với một số lý do nếu tôi quay resultset vào một danh sách, các DefaultIfEmpty() hoạt động tôi không biết nếu tôi đã inadve rtantly vượt qua vào Linq khu vực.

var results = (from u in rv.tbl_user 
         .Include("tbl_pics") 
         .Include("tbl_area") 
         .Include("tbl_province") 
         .ToList() 
         where u.tbl_province.idtbl_Province == prov 
         select new { u.firstName, u.cellNumber, u.tbl_area.Area, u.ID, u.tbl_province.Province_desc, 
            pic = (from p3 in u.tbl_pics 
              where p3.tbl_user.ID == u.ID 
              select p3.pic_path).DefaultIfEmpty("defaultpic.jpg").First() 
               }).ToList(); 
Các vấn đề liên quan