하는 데 도움이 번역 SQL 서버 UNION 구문이 필요하십니까 여기에 많은 잘못이 있습니다 - 그것은 단지 시작에 불과합니다. 그것은 위의 임시 열 또는 order by
조건과 제네릭/반환 형식 모호성을 고려하지 않는 것은 두 가지 다른 반환 형식을 이해하게 내 시도 :나는 아래 잘 작동 SQL을 LINQ
public List<T> GetSomething<T>(Int32 accountId)
{
List<T> result;
using (DataContext dc = _conn.GetContext())
{
IEnumerable<Alert> alerts = (from a in dc.Alerts
where a.AccountId == accountId
select a);
IEnumerable<StatusUpdate> updates = (from s in dc.StatusUpdates
where s.AccountId == accountId
select s);
IEnumerable<T> obj = alerts.Union(updates);
result = obj.ToList();
}
return result;
}
을 오전 데 문제가 있습니다 :
1) 내 선택에서 두 가지 유형 (경고 및 StatusUpdate)을 처리 중입니다. 결합 방법 (또는 반환 할 유형)을 잘 모르겠습니다. 제 생각에 이것들은 제네릭으로 해결할 수 있습니다. ?
2) 제 SQL에서이 코드는 (SELECT 10 AS Expr1) AS AlertTypeId
이며 임시 열 AlertTypeId에 값 10을 추가합니다 (Union이 Alert의 실제 열 AlertTypeId와 일치하도록 허용). LINQ에서 이와 같은 임시 열은 어떻게 이루어 집니까?/어떻게해야합니까?
도움 주셔서 감사합니다.
편집 --------------------------------- 편집 ---------- -------------------------------- EDIT
좋아요, 조금 더 있습니다. 아래는 제가 현재 가지고있는 것입니다. 친구 관계에 대한 업데이트를 반환하는 논리를 추가했음을 알 수 있습니다. 나는 또한 경고와 업데이트가 일치해야한다는 점을 감안할 때, 일반적인 유형의 IList
메소드를 만들었다. 호출 메소드에서 StatusUpdate를 전달합니다 (아래에서 더 자세히 설명합니다).
public IList GetUpdatesByAccountId<T>(Int32 accountId)
{
List<Friend> friends = _friendRepository.GetFriendsByAccountId(accountId);
using (DataContext dc = _conn.GetContext())
{
// Get all the account ids related to this user
var friendAccountIds =
friends.Select(friend => friend.MyFriendsAccountId).Distinct();
friendAccountIds = friendAccountIds.Concat(new[] { accountId });
var updates =
dc.StatusUpdates.Where(s => s.AccountId.HasValue && friendAccountIds.Contains(s.AccountId.Value)).Select(
s => new { Alert = (Alert)null, StatusUpdate = s});
var alerts =
dc.Alerts.Where(a => a.AccountId == accountId).Select(
a => new {Alert = a, StatusUpdate = (StatusUpdate) null});
var obj = updates.Union(alerts).Take(100);
return obj.OrderByDescending(su => su.StatusUpdate.CreateDate).ToList();
}
}
그리고, 호출 방법 :
public interface IAlertRepository
{
List<Alert> GetAlertsByAccountId(Int32 accountId);
void SaveAlert(Alert alert);
void DeleteAlert(Alert alert);
}
public interface IStatusUpdateRepository
{
StatusUpdate GetStatusUpdateById(Int32 statusUpdateId);
List<StatusUpdate> GetStatusUpdatesByAccountId(Int32 accountId);
List<StatusUpdate> GetFriendStatusUpdatesByAccountId(Int32 accountId, Boolean addPassedInAccount);
void SaveStatusUpdate(StatusUpdate statusUpdate);
List<StatusUpdate> GetTopNStatusUpdatesByAccountId(Int32 accountId, Int32 number);
List<StatusUpdate> GetTopNFriendStatusUpdatesByAccountId(Int32 accountId, Int32 number, Boolean addPassedInAccount);
}
현재 문제 :
protected void LoadStatus()
{
repStatusUpdates.DataSource = _statusRepository
.GetUpdatesByAccountId<StatusUpdate>(_userSession.CurrentUser.AccountId);
repStatusUpdates.DataBind();
}
여기에 내가 LINQ를 통해 내 알림 및 StatusUpdate 테이블에 액세스하는 데 사용하고있는 저장소에 대한 인터페이스입니다 :
1)이 코드를 컴파일하면이 이상한 오류가 발생합니다 :
Unable to cast object of type 'System.Data.Linq.SqlClient.SqlNew' to type 'System.Data.Linq.SqlClient.SqlValue'.
거기에 명확한 해결책은 없지만 (적어도 내가 알 수있는) 읽을 수있는 유일한 설명은 this link입니다. 그러나 위의 LINQ 코드가 잘 보이지 않으면 어쨌든이 오류가 사라질 수 있습니다.
(SELECT 10 AS Expr1) AS AlertTypeId
을하지만이 미성년자 :
2) 위의 코드는 여전히 원래 SQL에서이 줄을 차지하지 않습니다.
다시 도움을 청하십시오.
그 이상한 오류 메시지는 아마도 LinqToSQL 쿼리가 LinqToSQL에 비해 너무 복잡하다는 것을 의미합니다. 테스트를 복잡하게 만들었지 만이 테스트를 작성한 사람은 누구도 설명하지 못했습니다. – erikkallen
일반적인 방법으로 만들지는 모르겠다. 또한 SQL 쿼리에서 수행하는 작업이 아니기 때문에 유니온 작업 후에 테이크를 수행하지 않으려 고합니다. – Merritt
StatusUpdate/Alert 쌍 중 하나가 항상 null 인 목록을 만드는 데 가장 큰 팬이 아닙니다. 여기서 anonynonous 타입의 사용은 데이터 바인딩 외부의 유용성을 제한 할 것이고 속성 값을 찾기 위해 리플렉션을 잠재적으로 필요로 할 것입니다. – Merritt